//
//  WBUserAccountViewModel.swift
//  Weibo
//
//  Created by 汪博文 on 2016/11/16.
//  Copyright © 2016年 Wbw. All rights reserved.
//

/*
 viewModel 处理数据逻辑
 */
import UIKit
import SVProgressHUD

class WBUserAccountViewModel: NSObject {
    //视图模型需要引用模型对象 --> 视图模型需要处理数据逻辑
    var userAccount: WBUserAccount?
    //接口
    var access_token: String? {
        return userAccount?.access_token
    }
    //增加一个用户头像URL的头像地址
    var headURL: URL? {
        return URL(string: userAccount?.avatar_large ?? "")
    }
    
    
    //单列对象,全局只有一个登陆的用户,只存储一个用户的account.plist文件,一旦用户注销登陆之后就应该删除account.plist
    static let shared: WBUserAccountViewModel = WBUserAccountViewModel()
    
    
    //重写构造函数
    //在用户已经登录的情况下给模型赋值
    override init() {
        super.init()
        //保证以后再判断是否登录的时候 不下访问磁盘
        //将磁盘数据保存在内存中
        userAccount = self.loadUserAccount()
    }
    
    //判断用户是否登录
    //计算型属性
    var userLogin: Bool {
        //满足以下条件就认为用户已经登录
        //如果令牌不为空 并且 令牌没有过期
        if userAccount?.access_token != nil && isExpires == false {
            return true
        }
        //默认没有登录
        return false
    }
    //判断令牌是否过期
    var isExpires: Bool {
//        过期日期比当前日期大的时候,就没有过期
        //前面的日期 大于compare内的 日期 就是降序 没过期
        if userAccount?.expires_date?.compare(Date()) == ComparisonResult.orderedDescending {
            return false
        }
        //默认过期
        return true
    }
    
    //获取用户token
    func loadAccessToken(code: String, finished: @escaping (Bool) -> ()) {
        let urlString = "https://api.weibo.com/oauth2/access_token"
        let parameters = ["client_id" : client_id,
                          "client_secret" : client_secret,
                          "grant_type" : "authorization_code",
                          "code" : code,
                          "redirect_uri" : redirect_uri]
        HMNetworkTools.shared.request(method: .POST, urlString: urlString, parameters: parameters) { (responseObject, error) in
            if error != nil {
                SVProgressHUD.showError(withStatus: errorString)
                finished(false)
                return
            }
            //请求成功
            //使用access_token 和 uid 来请求用户接口
            //获取用户信息
            self.loadUserInfo(dict: responseObject as! [String : Any], finished: finished)
            
        }
    }
    private func loadUserInfo(dict: [String : Any], finished: @escaping (Bool) -> ()) {
        let urlString = "https://api.weibo.com/2/users/show.json"
        let token = dict["access_token"]!
        let uid = dict["uid"]!
        //oc中的字典不能存放nil
        let parameters = ["access_token" : token,
                          "uid" : uid]
        HMNetworkTools.shared.request(method: .GET, urlString: urlString, parameters: parameters) { (responseObject, error) in
            if error != nil {
                //SVProgressHUD.showError(withStatus: "世界上最遥远的距离是没有网络")
                finished(false)
                return
            }
            //print(responseObject)
            //将用户信息存储在本地
            //要把用户的access_token 也存储下来 但是responseObject里面没有
            //所以讲授权之后得到的字典和用户信息字典合并之后再存储
            var userInfoDict = responseObject as! [String : Any]
            for (key,value) in dict {
                userInfoDict[key] = value
            }
            //需要将userInfoDict转换模型对象
            //用归档的方式存储自定义模型对象
            //字典转模型
            let userAccount = WBUserAccount(dict : userInfoDict)
            //            print(userAccount)
            self.saveUserAccount(userAccount: userAccount)
            //给单例对象的模型对象赋值
            
            //如果不写,首次登录的时候会有bug
            self.userAccount = userAccount
            //执行成功的回调
            finished(true)
        }
    }
    //存储用户模型对象的方法 用归档的方法
    private func saveUserAccount(userAccount: WBUserAccount) {
        //存储在沙盒的document或者library,temp路径不会备份
        //拼接文件路径的方法string 没有 需要转换为NSString
        //使用as的前提:被转换的类型不能够为可选类型对象
        //        let path = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! as NSString).appendingPathComponent("account.plist")
        //存储自定义对象,自定义对象必须遵守 NSCoding协议 实现协议方法
        NSKeyedArchiver.archiveRootObject(userAccount, toFile: path)
        //      本地路径path: /Users/wangbowen/Library/Developer/CoreSimulator/Devices/0C4280C4-8457-4091-A2A8-C7D308D35DD1/data/Containers/Data/Application/14691982-6B92-43C3-98BC-CB93E4568915/Documents/account.plist
    }
    //读取本地数据
    //读取磁盘,四个页面读取四次
    private func loadUserAccount() -> WBUserAccount? {
        //调用解档的方法
        let account = NSKeyedUnarchiver.unarchiveObject(withFile: path)
        if let userAccount = account as? WBUserAccount {
            return userAccount
        }
        return nil
    }
}
